Estoy tratando de eliminar los caracteres entre paréntesis y corchetes en función de la longitud de los caracteres dentro de los paréntesis y corchetes.
Usando esto :
def remove_text_inside_brackets(text, brackets="()[]"): count = [0] * (len(brackets) // 2) # count open/close brackets saved_chars = [] for character in text: for i, b in enumerate(brackets): if character == b: # found bracket kind, is_close = divmod(i, 2) count[kind] += (-1)**is_close # `+1`: open, `-1`: close if count[kind] < 0: # unbalanced bracket count[kind] = 0 # keep it else: # found bracket to remove break else: # character is not a [balanced] bracket if not any(count): # outside brackets saved_chars.append(character) return ''.join(saved_chars)Puedo eliminar los caracteres entre paréntesis y corchetes, pero no sé cómo eliminar los caracteres en función de la longitud de los caracteres internos.
Quería eliminar los caracteres entre paréntesis y corchetes si la longitud <=4 con paréntesis y corchetes si son >4 eliminar solo paréntesis y corchetes. Texto de ejemplo:
text = "This is a sentence. (RMVE) (Once a day) [twice a day] [RMV]"Producción:
print(remove_text_inside_brackets(text)) This is a sentence.Salida deseada:
This is a sentence. Once a day twice a dayPuede usar una expresión regular simple con re.sub y una función como reemplazo para verificar la duración de la coincidencia:
import re out = re.sub('\(.*?\)|\[.*?\]', lambda m: '' if len(m.group())<=(4+2) else m.group()[1:-1], text)Producción:
'This is a sentence. Once a day twice a day 'Esto le brinda la lógica para verificaciones más complejas, en cuyo caso es posible que desee definir una función con nombre en lugar de una lambda
¿Qué tal dividir en [ y buscar ] y medir la longitud (dado que cada división con ] será necesariamente más larga que la división normal, 4 se convierte en 5):
def remove_text_inside_brackets(string): my_str = string.replace('(','[').replace(')',']') out = [] for s in my_str.split('['): if ']' in s and len(s) > 5: s1 = s.rstrip().rstrip(']') + ' ' elif ']' in s and len(s) <= 5: s1 = [''] else: s1 = s out.extend(s1) return ''.join(out).strip() remove_text_inside_brackets(text)Producción:
'This is a sentence. RMVE Once a day twice a day'Con suerte, alguien mejorará esto, pero como alternativa, esta expresión regular anidada puede funcionar:
re.sub(r'\[([^)]{5,})\]', '\g<1>', re.sub(r'\(([^)]{5,})\)', '\g<1>', re.sub(r'\[[^\]]{,4}\]', '', re.sub(r'\([^)]{,4}\)', '', text))))Tenga en cuenta que los espacios adicionales, después del punto y al final de la línea.
El resultado de esto es ligeramente diferente al resultado esperado dado:
'This is a sentence. Once a day twice a day 'Elimina por completo el texto y los corchetes que lo rodean cuando la longitud es 4 o menos, mientras que reemplaza la coincidencia con solo el texto interior donde la longitud es 5 o más.
Tenga en cuenta que los corchetes anidados, por ejemplo, ((some text) more text) o [(four)] pueden fallar.